package com.atguigu.tingshu.search.api;

import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.model.search.AlbumInfoIndex;
import com.atguigu.tingshu.query.search.AlbumIndexQuery;
import com.atguigu.tingshu.search.service.SearchService;
import com.atguigu.tingshu.vo.search.AlbumSearchResponseVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@Tag(name = "搜索专辑管理")
@RestController
@RequestMapping("api/search/albumInfo")
@SuppressWarnings({"all"})
public class SearchApiController {

    @Autowired
    private SearchService searchService;

    /**
     * 获取排行榜
     * @param category1Id
     * @param ranking
     * @return
     */
    @Operation(summary = "获取排行榜")
    @GetMapping("/findRankingList/{category1Id}/{ranking}")
    public Result findRankingList(@PathVariable Long category1Id, @PathVariable String ranking) {
        //调用service方法
        List<AlbumInfoIndex> list = searchService.findRankingList(category1Id, ranking);

        //返回结果
        return Result.ok(list);
    }

    /**
     * 更新排行榜
     * @return
     */
    @SneakyThrows
    @Operation(summary = "更新排行榜")
    @GetMapping("updateLatelyAlbumRanking")
    public Result updateLatelyAlbumRanking() {
        searchService.updateLatelyAlbumRanking();
        return Result.ok();
    }
    /**
     * 根据一级分类id获取频道信息
     * @param category1Id
     * @return
     */
    @Operation(summary = "根据分类id获取频道信息")
    @GetMapping("/channel/{category1Id}")
    public Result channel(@PathVariable Long category1Id) {
        //调用service方法
        List<Map<String, Object>> list =searchService.getChannel(category1Id);

        //返回结果
        return Result.ok(list);
    }
    /**
     * 根据专辑id获取专辑信息
     * @param albumId
     * @return
     */

    @Operation(summary = "实现自动补全")
    @GetMapping("completeSuggest/{keyWord}")
    public Result completeSuggest(@PathVariable String keyWord) {
        List<String> list = searchService.completeSuggest(keyWord);

        //返回结果
        return Result.ok(list);
    }

    /**
     * 上架专辑接口
     * 该接口用于将指定的专辑设置为上架状态
     * 通过调用搜索服务的upperAlbum方法来实现
     *
     * @param albumId 专辑ID，标识需要上架的专辑
     * @return 返回一个Result对象，表示操作的结果
     */
    @Operation(summary = "上架专辑")
    @GetMapping("/upperAlbum/{albumId}")
    public Result upperAlbum(@PathVariable Long albumId) {

        this.searchService.upperAlbum(albumId);

        return Result.ok();
    }
    /**
     * 处理下架专辑的请求
     *
     * @param albumId 专辑的ID，用于标识要下架的专辑
     * @return 返回一个Result对象，表示操作的结果
     *
     * 通过调用searchService中的lowerAlbum方法来实现专辑的下架功能
     * 该方法的具体实现应当处理与下架专辑相关的逻辑，例如更新专辑的状态或从搜索索引中移除等
     *
     * 此注释解释了方法的目的、参数及其作用，以及调用的服务和返回值的信息
     */
    @Operation(summary = "下架专辑")
    @GetMapping("/lowerAlbum/{albumId}")
    public Result lowerAlbum(@PathVariable Long albumId) {

        this.searchService.lowerAlbum(albumId);

        return Result.ok();
    }
    /**
     * 批量上传专辑信息
     * 该方法通过调用searchService的upperAlbum方法，循环上传1499个专辑的信息
     * 主要用于演示批量操作的场景
     *
     * @return 返回操作结果，上传成功后返回OK
     */
    @Operation(summary = "批量上传")
    @GetMapping("batchUpperAlbum")
    public Result batchUpperAlbum(){
        // 循环上传专辑信息，从1开始到1499结束，共上传1499个专辑的信息
        for (long i = 1; i < 1500; i++) {
            // 调用searchService的upperAlbum方法上传单个专辑信息
            searchService.upperAlbum(i);
        }
        // 所有专辑上传完成后，返回操作成功的结果
        return Result.ok();
    }
    /**
     * 检索操作
     *
     * @param albumIndexQuery 检索查询对象，包含检索的关键词和其他条件
     * @return 返回检索结果，封装在Result对象中
     */
    @Operation(summary = "检索")
    @PostMapping
    public Result search(@RequestBody AlbumIndexQuery albumIndexQuery) {
        // 调用服务层的方法进行检索操作
        AlbumSearchResponseVo albumSearchResponseVo = searchService.search(albumIndexQuery);

        // 构建并返回成功的Result对象，携带检索结果
        return Result.ok(albumSearchResponseVo);
    }
}

